#!/usr/bin/env python3
# Created by han on 2016/7/4
import socketserver
import subprocess
import json
import re

class Hftp(socketserver.BaseRequestHandler):
    def handle(self):
        home_name = self.request.recv(4096)
        self.request.send(bytes("欢迎使用Hftp", "utf8"))
        while True:
            data = self.request.recv(4096)          #接受客户端发来的命令
            client_data = data.decode()     #将用户传过来的bypes形式转换
            print(data,len(data))
            if len(data) == 0:                      #如果对方挂断，则执行这里
                break
            print("[%s] input: %s" % (self.client_address, client_data))
            if not re.findall("^\{.*\}$",client_data):    #如果客户端传过来的不是json格式，就是执行命令，
                self.task_cmd(client_data, home_name)
                continue
            task_data = json.loads(client_data)     #如果是json肯定就是注册上传和下载
            task_type = task_data["action"]         #获取用户的动作
            if hasattr(self, "task_%s" % task_type):        #判断没有这个功能
                func = getattr(self, "task_%s" % task_type) #有就执行
                func(task_data)

    def task_cmd(self, client_cmd, home_name):

        cmd_data = subprocess.Popen("%s %s" % (client_cmd, home_name.decode()), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        ret = cmd_data.stdout.read()  # python3 中默认返回的就是bytes类型
        if not ret:                   #如果没有正常输出，就是命令有问题
            ret = cmd_data.stderr.read()        #把错误信息读出来
        if len(ret) == 0:  # 执行命令的结果        #如果长度为零，就为这个命令没有返回值
            ret = bytes("cmd has output", "utf8")
        ready_data = "ready|%d" % len(ret)      #开始准备传输，解决粘包问题
        print(ready_data)
        self.request.sendall(bytes(ready_data, "utf8"))     #传输这个准备数据
        client_ready = self.request.recv(4096)
        print('-----client_ready', client_ready.decode())
        if client_ready.decode().startswith("start"):
            self.request.sendall(ret)



    def task_put(self):
        print("put")

    def task_get(self):
        print("get")

    def task_register(self, task_data):
        """
        用户注册
        :param task_data:  用户的信息，类型字典
        :return:
        """
        print("sever_recv-------", task_data)
        user_name = task_data["name"]               #获取用户名
        user_size = task_data["user_size"]          #获取用户空间大小
        home_name = user_name + "_" + user_size     #拼接家目录名字
        subprocess.call("mkdir %s" % home_name, shell=True)  #创建家目录
        self.request.send(bytes("success", "utf8"))    #发送成功信息

if __name__ == '__main__':
    server = socketserver.ThreadingTCPServer(("0.0.0.0", 8899), Hftp)
    server.serve_forever()



    #注册出现为题